/**
 * 1. 数组（Array）
 *  数组也是一个对象，它和我们普通对象类似，也是用来储存一些值的，不同的是普通对象是使用字符串作为属性名的，而数组是使用数字作为索引操作元素的。
 *
 *  索引：
 *      从0开始的整数就是所用
 *
 *  数组的储存性能比我们普通对象要好，在开发中我们经常使用数组来存储一些数据
 * */

var arr = new Array(); // 创建一个数组

console.log(typeof arr); // 使用typeof检查一个数组时，会返回一个object

/**
 * 向数组中添加元素:
 *  语法：数组[索引] = 值
 *
 * */
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;

console.log(arr);

/**
 * 读取数组中的元素
 * 语法：数组[索引]
 * */

console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
console.log(arr[3]); // 读取不存在的索引返回值为undefined

/**
 * 获取数组的长度：
 *  对于我们连续的数组，使用length可以获取到数组的长度（元素的个数）
 *  对于非连续的数组，使用length会获取到数组最大的索引+1
 *
 *  尽量不要创建这种非连续的数组
 * */

console.log("数组的长度： " + arr.length);

/**
 * 向数组的最后一个位置添加元素
 * */
arr[arr.length] = 70;
arr[arr.length] = 80;
console.log(arr);


console.log("-------------------------------数组的字面量-------------------------------");

/**
 * 使用字面量来创建数组
 * */

var arr2 = [];

var arr3 = [1, 2, 3, 4, 5]; //  使用字面量创建数组时，可以在创建时就指定数组中的元素

console.log(arr3);

arr2 = [10]; // 创建一个数组，数组中只有一个元素10
var arr4 = new Array(10); //创建一个长度为10的数组

/**
 * 数组中的元素可以是任意数据类型，也可以是对象，也可以是一个函数
 * */

var arrObj = [{name:"孙悟空"}, {name:"猪八戒"}, {name:"唐僧"}]; // 数组中放入对象

var arrFun = [function abc() {}, function () {}]; // 数组中放入函数

var arrArr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // 数组中也可以放入数组


console.log("-------------------------------数组的方法-------------------------------");

/**
 *
 * 数组的四个方法：
 *  push(); 该方法可以向数组的末尾添加一个或者多个元素，并返回新的长度
 *  pop(); 删除并返回数组的最后一个元素
 *
 *  unshift(); 向数组的开头添加一个或者更多元素，并返回新的长度
 *  shift(); 删除并返回数组的第一个元素
 *
 *  slice(); 从某个已有的数组返回选定的元素
 *      参数：截取开始的位置索引, 包含开始索引
 *           截取结束的位置索引, 不包含结束索引
 *      该方法不会改变原数组，而是将截取到的元素封装到一个新的数组中返回
 *
 *      索引可以传递一个负值，如果传递一个负值，则从后往前计算
 *      -1倒数第一个
 *      -2倒数第二个
 *
 *  splice(); 删除元素，并向数组添加新元素
 *      使用splice();方法会影响到原数组，会将指定元素从数组中删除，并将被删除的元素，作为返回值返回。
 *      参数：
 *          第一个参数表示开始位置的索引
 *          第二个参数表示删除元素的个数
 *          第三个及以后...的参数：可以传递一些新的元素，这些元素将会自动插入到开始位置索引前面
 *
 * */

var arrMethod = ["孙悟空", "猪八戒", "沙和尚"];
var length = arrMethod.push("唐僧", "二郎神");
console.log(arrMethod);
console.log("length = " + length);

var result = arrMethod.pop();
console.log(arrMethod);
console.log("result = " + result);

var indexArr = arrMethod.unshift("如来", "三太子");
console.log(arrMethod);
console.log("indexArr = " + indexArr);

var indexResult = arrMethod.shift();
console.log(arrMethod);
console.log("indexResult = " + indexResult);


console.log("--------------------------------------数组的两个方法--------------------------------------");

var spArr = ["唐僧", "孙悟空", "猪八戒", "沙和尚", "白龙马"];
var spArr2 = spArr.slice(0, 2);
console.log(spArr2);

var spArr3 = ["唐僧", "孙悟空", "猪八戒", "沙和尚", "白龙马"];
var sp01 = spArr3.splice(0, 2);
console.log(spArr3); // 该方法会影响原数组
console.log(sp01);

var sp02 = spArr3.splice(0, 0, "牛魔王");
console.log(spArr3);

console.log("--------------------------------------数组剩余的方法--------------------------------------");


/**
 * concat();
 *      可以连接两个或者多个数组，并将新的数组返回
 *      该方法不会对原数组产生影响
 *
 * join();
 *      该方法可以将数组转换为一个字符串
 *      该方法不会对原数组产生影响,而是将转换后的结果作为结果返回
 *      在join中可以指定一个字符串作为参数，这个字符串将会成为数组中的连接符, 如果不指定连接符，则默认使用逗号作为连接符
 *
 * reverse();
 *      该方法用来反转数组
 *      该方法可以直接修改原数组
 *
 * sort();
 *      可以用来对数组中的元素进行排序
 *      该方法可以直接修改原数组，默认按照Unicode编码进行排序
 *      即使对纯数字的数组进行排序，也会按照Unicode编码排序，可能会得到错误的结果，例如：11会排在2前面
 *      对于这种情况我们可以自己来指定排序的规则：
 *          我们可以在sort中添加一个回调函数，来指定排序规则，回调函数需要定义两个形参，浏览器将会分别使用数组中的元素为实参来调用回调函数
 *          使用哪个元素调用不确定，但是肯定的是在数组中a一定在数组前边
 *
 *      浏览器会根据回调函数的返回值来决定元素的顺序，如果返回一个大于0的值，则元素会交换位置
 *                                               如果返回一个小于0的值，则元素位置不变
 *                                               如果返回一个等于0的值，则认为两个元素相等，同样不交换位置
 *      排序的核心是a, b两个形参不断交换位置
 * */

var test01 = ["孙悟空", "猪八戒", "沙和尚"];
var test02 = ["唐僧", "白龙马"];
var test03 = ["二郎神", "托塔天王"];

var sum = test01.concat(test02, test03, "铁扇公主", "牛魔王");
console.log(sum);

var str = sum.join();
console.log(typeof str + ", " + str);
var str2 = sum.join("-");
console.log(typeof str2 + ", " + str2);

sum.reverse();
console.log(sum);

sum.sort();
console.log(sum);

var shuzi = [5, 4, 1, 6, 7, 3, 5];
/*shuzi.sort(function (a, b) {
    if(a > b) {
        return 1;
    } else if(a < b) {
        return -1;
    } else {
        return 0;
    }
});*/
/**排序简化版*/
shuzi.sort(function (a, b) {
   // return a - b;
   return b - a;
});

console.log(shuzi);












